package com.sms.sendservice.aspect;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.sms.common.result.Result;
import com.sms.sendservice.annotation.GlobalRateLimit;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class GlobalRateLimitAspect {

    // 切点：拦截所有标注了@GlobalRateLimit的方法
    @Pointcut("@annotation(globalRateLimit)")
    public void rateLimitPointcut(GlobalRateLimit globalRateLimit) {}

    // 环绕通知：在方法执行前后处理限流
    @Around("rateLimitPointcut(globalRateLimit)")
    public Object around(ProceedingJoinPoint joinPoint, GlobalRateLimit globalRateLimit) throws Throwable {
        String resource = globalRateLimit.resource(); // 获取注解中定义的资源名
        Entry entry = null ;
        try {
            // 触发限流检查
            entry = SphU.entry(resource);
            // 执行原方法（业务逻辑）
            return joinPoint.proceed();
        } catch (BlockException e) {
            // 限流触发时的处理（如返回限流提示）
            log.warn("接口被限流，资源：{}", resource);
            return Result.error("当前请求过忙，请稍后再试"); // 假设Result是统一响应对象
        } finally {
            // 退出限流上下文（必须在finally中执行）
            if(entry != null) {
                entry.exit();
            }
        }
    }
}
